'''
    jsonable_encoder
    在实际应用场景中，可能需要将数据类型（如：Pydantic 模型）转换为与 JSON 兼容的类型（如：字典、列表）
    比如：需要将数据存储在数据库中
    为此，FastAPI 提供了一个 jsonable_encoder() 函数
    jsonable_encoder 实际上是 FastAPI 内部用来转换数据的，但它在许多其他场景中很有用

    实际栗子
    需求
    假设有一个仅接收兼容 JSON 数据的数据库 fake_db
    例如，它不接收日期时间对象，因为这些对象与 JSON 不兼容
    因此，必须将日期时间对象转换为包含 ISO 格式数据的 str
    同样，这个数据库不会接收 Pydantic 模型（具有属性的对象），只会接收 dict
    使用 jsonable_encoder 将数据转换成 dict
'''

from datetime import datetime
from typing import Optional

import uvicorn
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel

# 模拟数据库
fake_db = {}


class Item(BaseModel):
    title: str
    timestamp: datetime
    age: Optional[int] = None


app = FastAPI()


@app.post("/items/{id}")
def update_item(id: str, item: Item):
    # 1、打印刚传进来的数据和类型
    print(f"item is {item}\nitem type is {type(item)}")

    # 2、调用 jsonable_encoder 将 Pydantic Model 转成 Dict
    json_compatible_item_data = jsonable_encoder(item)

    # 3、模拟将数据落库操作
    fake_db[id] = json_compatible_item_data

    # 4、打印转换后的数据和类型
    print(f"encoder_data is {json_compatible_item_data}\nencoder_data type is {type(json_compatible_item_data)}")
    return json_compatible_item_data


if __name__ == "__main__":
    uvicorn.run(app="main:app", host="127.0.0.1", port=8000, reload=True, debug=True)